package com.sgb.alimaplibrary;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;

/**
 * 地图定位工具类
 */
public class MapLocationTools {

    private Context mContext;
    //声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;

    //声明AMapLocationClientOption对象
    public AMapLocationClientOption mLocationOption = null;
    private boolean isContinuous = false;
    private LocationListener locationListener;
    private LoctionDetailListener loctionDetailListener;


    public MapLocationTools(Context applicationContext) {
        this.mContext = applicationContext;
    }

    /**
     * 定位初始化
     * isContinuous  是否持续定位 true 是， false 否
     */
    public void initLocation(boolean isContinuous) {
        this.isContinuous = isContinuous;
        //初始化定位
        mLocationClient = new AMapLocationClient(mContext);
        //设置定位回调监听
        mLocationClient.setLocationListener(mLocationListener);
        //初始化AMapLocationClientOption对象
        mLocationOption = new AMapLocationClientOption();
        //设置定位模式为AMapLocationMode.Hight_Accuracy，高精度模式。
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//        //设置定位模式为AMapLocationMode.Battery_Saving，低功耗模式。
//        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
//        //设置定位模式为AMapLocationMode.Device_Sensors，仅设备模式。
//        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);
        //获取一次定位结果：true
        //该方法默认为false。
        mLocationOption.setOnceLocation(!isContinuous);
        if (isContinuous){
            //设置定位间隔
            mLocationOption.setInterval(5 * 60 * 1000);
        }else {
            //获取最近3s内精度最高的一次定位结果：
            //设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。
            // 如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。
            mLocationOption.setOnceLocationLatest(true);
        }
        //设置是否返回地址信息（默认返回地址信息）
        mLocationOption.setNeedAddress(true);
        //设置定位请求超时时间，默认为30秒。单位是毫秒，默认30000毫秒，建议超时时间不要低于8000毫秒。
        mLocationOption.setHttpTimeOut(30000);
        //关闭缓存机制
        mLocationOption.setLocationCacheEnable(false);
    }

    //声明定位回调监听器
    public AMapLocationListener mLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if (aMapLocation != null) {
                if (aMapLocation.getErrorCode() == 0) {
                    //可在其中解析amapLocation获取相应内容。
                    getLocationData(aMapLocation);
                }else {
                    //定位失败时，可通过ErrCode（错误码）信息来确定失败的原因，errInfo是错误信息，详见错误码表。
                    Log.e("AmapError","location Error, ErrCode:"
                            + aMapLocation.getErrorCode() + ", errInfo:"
                            + aMapLocation.getErrorInfo());
                }
            }
            if (!isContinuous){
                destroy();
            }
        }
    };

    private void getLocationData(AMapLocation amapLocation) {
//        amapLocation.getLocationType();//获取当前定位结果来源，如网络定位结果，详见定位类型表
//        amapLocation.getLatitude();//获取纬度
//        amapLocation.getLongitude();//获取经度
//        amapLocation.getAccuracy();//获取精度信息
//        amapLocation.getAddress();//地址，如果option中设置isNeedAddress为false，则没有此结果，网络定位结果中会有地址信息，GPS定位不返回地址信息。
//        amapLocation.getCountry();//国家信息
//        amapLocation.getProvince();//省信息
//        amapLocation.getCity();//城市信息
//        amapLocation.getDistrict();//城区信息
//        amapLocation.getStreet();//街道信息
//        amapLocation.getStreetNum();//街道门牌号信息
//        amapLocation.getCityCode();//城市编码
//        amapLocation.getAdCode();//地区编码
//        amapLocation.getAoiName();//获取当前定位点的AOI信息
//        amapLocation.getBuildingId();//获取当前室内定位的建筑物Id
//        amapLocation.getFloor();//获取当前室内定位的楼层
//        amapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
//        获取定位时间
//        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        Date date = new Date(amapLocation.getTime());
//        df.format(date);
        if (locationListener != null){
            locationListener.getLocationListener(amapLocation.getAddress(),amapLocation.getLongitude(),amapLocation.getLatitude());
        }
        //保存定位省市区
        if(!TextUtils.isEmpty(amapLocation.getCity())) {
            if(loctionDetailListener!=null) {
                loctionDetailListener.getLocationDetailListener(amapLocation);
            }
        }

    }

    /**
     * 开始定位
     */
    public void startLocation(){
        if (mLocationClient == null || mLocationOption == null) return;
        //给定位客户端对象设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
        //销毁正在运行的服务
        mLocationClient.stopLocation();
        //启动定位
        mLocationClient.startLocation();
    }

    public void stopLocation() {
        if (mLocationClient != null){
            mLocationClient.stopLocation();//停止定位后，本地定位服务并不会被销毁
        }
    }

    public void destroy() {
        if (mLocationClient != null){
            mLocationClient.stopLocation();//停止定位后，本地定位服务并不会被销毁
            mLocationClient.onDestroy();//销毁定位客户端，同时销毁本地定位服务。
        }
    }

    public interface LocationListener{
        void getLocationListener(String address,Double Longitude,Double Latitude);
    }
    public interface LoctionDetailListener{
        void getLocationDetailListener(AMapLocation aMapLocation);
    }

    public void setLocationListener(LocationListener locationListener){
        this.locationListener = locationListener;
    }

    public void setLoctionDetailListener(LoctionDetailListener loctionDetailListener) {
        this.loctionDetailListener = loctionDetailListener;
    }
}
